package com.jdk.demo.queue.priorityQueue;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.PriorityBlockingQueue;

/**PriorityBlockingQueue一个支持优先级排序的无界阻塞队列。默认情况下元素采用自然顺序升序排列。
 * 里面存储的对象必须是实现Comparable接口。队列通过这个接口的compare方法确定对象的priority。
规则是：当前和其他对象比较，如果compare方法返回负数，那么在队列里面的优先级就比较高。
PriorityBlockingQueue队列添加新元素时候不是将全部元素进行顺序排列，而是从某个指定位置开始将新元素与之比较，一直比到队列头，这样既能保证队列头一定是优先级最高的元素，又能减少排序带来的性能消耗。
但是这样会出现一个情况，取完队列头时候，后面的剩余的元素不是排序的，岂不是不符合要求了，继续查看源码，发现每取一个头元素时候，都会对剩余的元素做一次调整，这样就能保证每次队列头的元素都是优先级最高的元素。

基于优先级的阻塞队列（优先级的判断通过构造函数传入的Compator对象来决定），但需要注意的是PriorityBlockingQueue并不会阻塞数据生产者，而只会在没有可消费的数据时，阻塞数据的消费者。
因此使用的时候要特别注意，生产者生产数据的速度绝对不能快于消费者消费数据的速度，否则时间一长，会最终耗尽所有的可用堆内存空间。
 * @author DELL
 *
 */
public class PriorityQueueDemo {

    public static void main(String args[]) throws InterruptedException{
        final PriorityBlockingQueue<PriorityEntity> q = new PriorityBlockingQueue<>(3);
        ExecutorService se = Executors.newCachedThreadPool();
        //execute producer
        se.execute(new Producer(q));
        Thread.sleep(1000);
        //execute consumer
        //se.execute(new Consumer(q));
        q.remove(new PriorityEntity("A Product: " + 2, 2));
    }

}